package com.zmn.mcc.services.interfaces.staff;

import com.zmn.common.dto.LoginStaff;
import com.zmn.common.dto.StatusDTO;
import com.zmn.common.dto.VtDTO;
import com.zmn.mcc.common.dto.exception.MccException;
import com.zmn.mcc.common.dto.staff.StaffIdAndRealNameDRO;
import com.zmn.mcc.model.dto.staff.McStaffSimpleDTO;
import com.zmn.mcc.model.entity.staff.*;
import com.zmn.mcc.model.vo.McStaffVO;

import java.util.List;

/**
 * @author heguanghua
 * @since 2020/04/14 13:58
 */
public interface StaffService {

    /**
     * 根据dTalkId统计数据（排除当前员工，判断dTalkId是否重复）
     *
     * @param staffId 排除的员工Id
     * @param dTalkId 钉钉userId
     * @return
     */
    Integer countByDTalkIdAndNotStaffId(Integer staffId, String dTalkId);

    /**
     * 根据staffNumber统计数据（排除当前员工，判断staffNumber是否重复）
     *
     * @param staffId     排除的员工Id
     * @param staffNumber 员工工号
     * @return
     */
    Integer countBystaffNumberAndNotStaffId(Integer staffId, String staffNumber);

    McStaff findByKey(Integer staffId);

    /**
     * 取得登录所需的员工信息
     *
     * @param query
     * @return
     */
    McStaff findForLogin(McStaffQuery query);

    /**
     * 根据钉钉userId查询员工信息
     *
     * @return Staff
     */
    McStaff findByDTalkId(String dUserid);

    /**
     * 校验员工用户名是否存在
     *
     * @param staffName 员工用户名
     * @param staffId   员工ID
     * @return
     */
    Boolean findStaffNameExists(String staffName, Integer staffId);

    Boolean findStaffNameExists(McStaff query);

    /**
     * 校验手机号是否存在
     *
     * @param mobile  手机号
     * @param staffId 员工ID
     * @return
     */
    Boolean findMobileExists(String mobile, Integer staffId);

    Boolean findMobileExists(McStaff query);

    /**
     * 校验邮箱是否存在
     *
     * @param mail    邮箱
     * @param staffId 员工ID
     * @return
     */
    Boolean findMailExists(String mail, Integer staffId);

    Boolean findMailExists(McStaff query);

    /**
     * 用于工号是否唯一判断
     *
     * @param staff
     * @return
     */
    Boolean findStaffNumberExists(McStaff staff);

    /**
     * 描述: 查询工程师最大的员工账号
     *
     * @return java.lang.String
     * @author guoqiao
     * @since 2021/3/1 16:10
     */
    String findMaxStaffName();

    List<McStaff> listPageByQuery(McStaffQuery query);

    List<McStaffVO> listPageInfoByQuery(McStaffQuery query);

    List<McStaff> listByQuery(McStaffQuery query);

    /**
     * 根据指定信息取得员工列表
     *
     * @param keyword 文本信息，可以是员工账号/登录名、真实姓名、姓名拼音、手机号、电话、邮箱等
     * @param status  员工状态，指停用、启用状态
     * @return
     */
    List<McStaff> listSimpleByKeyword(String keyword, Integer status);

    /**
     * 根据员工电话查询启用的并且有钉钉userId的员工信息
     *
     * @param mobile 员工股电话
     * @return
     */
    List<McStaff> listByMoblieAndDTalkIdIsNotNull(String mobile);


    /**
     * 根据指定角色取得员工列表
     *
     * @param roleId 角色ID
     * @param status 员工状态，指停用、启用状态
     * @return
     */
    List<McStaff> listSimpleByRoleId(Integer roleId, Integer status);

    /**
     * 根据角色ID集合取得员工列表
     *
     * @param roleIds 角色ID
     * @param status  员工状态，指停用、启用状态
     * @return
     */
    List<McStaff> listSimpleByRoleIds(List<Integer> roleIds, Integer status);

    /**
     * 根据角色ID集合取得员工列表
     *
     * @param roleIds 角色ID
     * @param status  员工状态，指停用、启用状态
     * @return
     */
    List<McStaffSimpleDTO> listStaffByRoleIdsIncludeRoleId(List<Integer> roleIds, Integer status);

    /**
     * 根据指定部门取得员工列表
     *
     * @param deptIds 部门ID，可以为一级部门ID、二级部门ID、三级部门ID
     * @param status  员工状态，指停用、启用状态
     * @return
     */
    List<McStaff> listSimpleByDeptIds(List<Integer> deptIds, Integer status);

    /**
     * 根据指定员工ID取得员工列表
     *
     * @param staffIds 员工ID
     * @param status   员工状态，指停用、启用状态
     * @return
     */
    List<McStaff> listSimpleByStaffIds(List<Integer> staffIds, Integer status);

    /**
     * 描述: 根据指定部门（本级及下级）取得员工（在职、启用、非工程师）id列表
     *
     * @param deptIds 部门ID集合，可以为一级部门ID、二级部门ID、三级部门ID
     * @return
     * @author guoqiao
     * @since 2021/3/5 17:52
     */
    List<Integer> listStaffIdByDeptIds(List<Integer> deptIds);

    /**
     * 根据id信息查找北森员工信息
     *
     * @param bsUserIds
     * @return
     */
    List<McStaff> listBsStaffInfo(List<Integer> bsUserIds);

    /**
     * 查询员工基本信息
     *
     * @param query 如果query.number不传或者为0，则默认值为100
     * @return
     */
    List<McStaff> listSimpleByQuery(McStaffQuery query);

    List<VtDTO> listVtByStatus(Integer status, List<Integer> staffStatusList, Integer number);

    /**
     * 查询员工基本信息
     *
     * @param query 如果query.number不传或者为0，则默认值为100
     * @return
     */
    List<McStaff> listSubStaffByQuery(McStaffQuery query);

    /**
     * 描述: 根据员工id集合、部门id、状态，查询员工id与姓名
     *
     * @param staffIdList 员工id集合
     * @param deptId      部门id
     * @param status      状态：1 停止 2 正常/启用
     * @return List<StaffIdAndRealNameDRO>
     * @author xujie
     * @since 2021/04/28
     **/
    List<StaffIdAndRealNameDRO> listStaffIdByStaffIdListAndDeptIdAndStatus(List<Integer> staffIdList, Integer deptId, Integer status);

    /**
     * 描述: 根据员工id集合查询钉钉Id
     *
     * @param staffIdList 员工id集合
     * @return List<StaffIdAndDTalkId>
     * @author xujie
     * @since 2021/04/28
     **/
    List<StaffIdAndDTalkId> listStaffIdAndDTalkIdByStaffIdList(List<Integer> staffIdList);

    /**
     * 描述: 根据员工id集合查询部门Id
     *
     * @param staffIdList 员工id集合
     * @return List<StaffIdAndDeptId>
     * @author xujie
     * @since 2021/05/28
     **/
    List<StaffIdAndDeptId> listStaffIdAndDeptIdByStaffIdList(List<Integer> staffIdList);

    Integer countByQuery(McStaffQuery query);

    Integer countPageInfoByQuery(McStaffQuery query);

    Integer updateByKey(McStaff staff);

    Integer updateDTalkId(McStaff staff);

    Integer updateBsStaff(McStaff staff);

    /**
     * 修改密码
     *
     * @param staffId  员工ID
     * @param password 密码
     * @param updater
     * @return
     */
    Integer updatePassword(Integer staffId, String password, String updater);

    Integer updatePassword(McStaff staff);

    /**
     * 设置为初始密码
     *
     * @param password
     * @param loginStaff
     * @param staffId
     * @return
     */
    Integer updateInitPasswordByKey(String password, LoginStaff loginStaff, Integer staffId);

    /**
     * 修改最后一次登录时间
     *
     * @param staffId 员工ID
     * @return
     */
    Integer updateLastLoginTime(Integer staffId);

    Integer updateLastLoginTime(McStaff staff);

    Integer updateWhitelist(Integer staffId, Integer whitelist, String updater);

    Integer updateWhitelist(McStaff staff);

    Integer updatePermitSelf(Integer staffId, Integer permitSelf, String updater);

    Integer updatePermitSelf(McStaff staff);

    /**
     * 修改用户的组织、区域、渠道是否自定义数据权限
     *
     * @param staff
     * @return
     */
    Integer updateDpermitSelf(McStaff staff);

    Integer updateDpermitOrgSelf(Integer staffId, Integer dpermitOrgSelf, String updater);

    Integer updateDpermitOrgSelf(McStaff staff);

    Integer updateDpermitDeptSelf(Integer staffId, Integer dpermitDeptSelf, String updater);

    Integer updateDpermitDeptSelf(McStaff staff);

    Integer updateDpermitAreaSelf(Integer staffId, Integer dpermitAreaSelf, String updater);

    Integer updateDpermitAreaSelf(McStaff staff);

    Integer updateDpermitCooperationSelf(Integer staffId, Integer dpermitChannelSelf, String updater);

    Integer updateDpermitCooperationSelf(McStaff staff);

    Integer updateDpermitCubeSelf(Integer staffId, Integer dpermitCubeSelf, String updater);

    Integer updateDpermitCubeSelf(McStaff staff);

    Integer updateDpermitMeasureSelf(Integer staffId, Integer dpermitMeasureSelf, String updater);

    Integer updateDpermitMeasureSelf(McStaff staff);

    Integer updateDpermitProductSelf(Integer staffId, Integer dpermitSelf, String updater);

    Integer updateDpermitPromotionSelf(Integer staffId, Integer dpermitSelf, String updater);

    Integer updateDpermitChannelSelf(Integer staffId, Integer dpermitSelf, String updater);

    Integer updateDpermitProductSelf(McStaff staff);

    Integer updateDpermitPromotionSelf(McStaff staff);
    Integer updateDpermitChannelSelf(McStaff staff);

    /**
     * 根据员工ID更新员工钉钉userId
     *
     * @param dTalkId  员工钉钉userId
     * @param staffId  员工ID
     * @param realName 操作人
     * @return
     */
    Integer updateDtalkIdByStaffId(Integer staffId, String dTalkId, String realName);

    Integer updateStatus(Integer staffId, Integer status, String updater);

    Integer updateStatus(McStaff staff);

    Integer updateStatusBatch(List<Integer> staffIds, Integer status, LoginStaff staffLogin, String ip);

    Integer updateStatusBatch(StatusDTO dto);

    Integer updateSort(Integer staffId, Integer sort);

    Integer updateSort(McStaff staff);

    /**
     * 描述: 员工离职
     *
     * @param staffId    待离职员工ID
     * @param staffLogin 登录用户
     * @auther: tanghongjun
     * @since: 2020年10月21日10:13:28
     */
    void leaveStaff(Integer staffId, LoginStaff staffLogin, String ip) throws MccException;

    /**
     * 描述: 员工复职
     *
     * @param staffId    待离职员工ID
     * @param staffLogin 登录用户
     * @auther: tanghongjun
     * @since: 2020年10月21日10:13:28
     */
    void reinstatementStaff(Integer staffId, LoginStaff staffLogin, String ip) throws MccException;


    Integer insert(McStaff staff);


    Integer deleteByKey(Integer staffId);

    /**
     * 批量新增北森倒进的员工信息
     *
     * @param staff
     */
    Integer insertBsStaff(McStaff staff);

    /**
     * 根据北森用户ID统计数据，并排除当前员工
     *
     * @param staffId  排除的员工Id
     * @param bsUserId 北森用户ID
     * @return
     */
    Integer countByBsUserIdAndNotStaffId(Integer staffId, Integer bsUserId);

    /**
     * 根据员工ID更新员工北森用户ID
     *
     * @param staffId  员工ID
     * @param bsUserId 员工北森用户ID
     * @param realName 操作人
     * @return
     */
    Integer updateBsUserIdByStaffId(Integer staffId, Integer bsUserId, String realName);

    /**
     * 查询所有的北森用户ID
     *
     * @return
     */
    List<StaffIdAndBsUserId> listStaffIdAndBsUserId();

    /**
     * 描述: 查询指定的用户信息
     *
     * @param dingTalkId
     * @return com.zmn.mcc.model.entity.staff.McStaff
     * @author jiafei
     * @since 2021/8/12 14:03
     */
    McStaff findStaffByDingTalkId(String dingTalkId);

    /**
     * 更新员工工作时间
     *
     * @param staff 员工数据
     */
    void updateWorkTime(McStaff staff);

    /**
     * 通过北森用户ID查询员工信息
     *
     * @param bsUserId 北森用户ID
     * @return
     */
    McStaff findByBsUserId(Integer bsUserId);

    /**
     * 根据邮箱获取钉钉ID
     *
     * @param mail
     * @return
     */
    String getDTalkIdByMail(String mail);

    /**
     * 描述: 根据部门id更新员工的部门名称
     *
     * @param deptId
     * @param deptName
     * @author guoqiao
     * @since 2022/1/24 16:06
     */
    void updateDeptNameByDeptId(Integer deptId, String deptName);


    /**
     * 描述: 根据一二级部门Id查询员工
     *
     * @param deptOneId  deptOneId
     * @param deptTwoIds deptTwoIds
     * @return java.util.List<com.zmn.mcc.model.entity.staff.McStaff>
     * @author jiafei
     * @since 2022/7/27 14:48
     */
    List<McStaff> listSimpleStaffByDeptIds(Integer deptOneId, List<Integer> deptTwoIds);

    /**
     * 描述:
     *
     * @param staffIds staffIds
     * @return java.util.List<com.zmn.mcc.model.entity.staff.McStaff>
     * @author jiafei
     * @since 2022/7/28 16:08
     */
    List<McStaff> listByLeaderIds(List<Integer> staffIds);

    /**
     * 根据手机号查询
     *
     * @param mobile
     * @return
     */
    List<McStaff> listByMobile(String mobile);
}
